home *** CD-ROM | disk | FTP | other *** search
/ Speccy ClassiX 1998 / Speccy ClassiX 98.iso / amiga_system / the_aminet / dev / gcc / ixemulsrc.lha / ixemul-41.4 / library / symlink.c < prev    next >
C/C++ Source or Header  |  1995-05-17  |  2KB  |  104 lines

  1. /*
  2.  *  This file is part of ixemul.library for the Amiga.
  3.  *  Copyright (C) 1991, 1992  Markus M. Wild
  4.  *
  5.  *  This library is free software; you can redistribute it and/or
  6.  *  modify it under the terms of the GNU Library General Public
  7.  *  License as published by the Free Software Foundation; either
  8.  *  version 2 of the License, or (at your option) any later version.
  9.  *
  10.  *  This library is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  *  Library General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU Library General Public
  16.  *  License along with this library; if not, write to the Free
  17.  *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  *
  19.  *  symlink.c,v 1.1.1.1 1994/04/04 04:30:36 amiga Exp
  20.  *
  21.  *  symlink.c,v
  22.  * Revision 1.1.1.1  1994/04/04  04:30:36  amiga
  23.  * Initial CVS check in.
  24.  *
  25.  *  Revision 1.2  1992/07/04  19:21:58  mwild
  26.  *  cut a possibly leading `./' in symlink contents. This is a kludge, but it's
  27.  *  the only way to get `configure' working without changes.
  28.  *
  29.  * Revision 1.1  1992/05/14  19:55:40  mwild
  30.  * Initial revision
  31.  *
  32.  */
  33.  
  34. #define KERNEL
  35. #include "ixemul.h"
  36.  
  37. #if __GNUC__ != 2
  38. #define alloca __builtin_alloca
  39. #endif
  40.  
  41. #ifndef LINK_SOFT
  42. #define LINK_SOFT 1
  43. #endif
  44.  
  45. static void u2a(char *orig, char *new)
  46. {
  47.   char *p;
  48.  
  49.   if (ix.ix_translate_symlinks || index(orig, ':'))
  50.   {
  51.     strcpy(new, orig);
  52.     return;
  53.   }
  54.   if (*orig == '/')
  55.   {
  56.     while (*orig++ == '/');
  57.     while (*orig && *orig != '/')
  58.       *new++ = *orig++;
  59.     *new++ = ':';
  60.     if (*orig)
  61.       orig++;
  62.   }
  63.   while (*orig)
  64.   {
  65.     if (!memcmp(orig, "../", 3))
  66.     {
  67.       orig += 3;
  68.       *new++ = '/';
  69.     }
  70.     else if (!memcmp(orig, "./", 2))     
  71.       orig += 2;
  72.     else if (*orig == '/')
  73.       orig++;
  74.     else if (!strcmp(orig, ".."))
  75.     {
  76.       orig += 2;
  77.       *new++ = '/';
  78.     }
  79.     else if (!strcmp(orig, "."))
  80.       orig++;
  81.     else
  82.     {
  83.       while (*orig && *orig != '/')
  84.         *new++ = *orig++;
  85.       if (*orig == '/')
  86.         *new++ = *orig++;
  87.     }
  88.   }
  89.   *new = '\0';
  90. }
  91.  
  92. int
  93. symlink (char *old, char *new)
  94. {
  95.   char *lstr;
  96.   int len;
  97.  
  98.   /* is long-alignment needed here? This is DOS, isn't it... */
  99.   lstr = alloca (strlen (old) + 4);
  100.   lstr = LONG_ALIGN (lstr);
  101.   u2a(old, lstr);
  102.   return __make_link (new, lstr, LINK_SOFT) == -1 ? 0 : -1;
  103. }
  104.